package 对话框类

import (
	common "gitee.com/go_888/xcgui/common"
	wapi "gitee.com/go_888/xcgui/wapi"
	xc "gitee.com/go_888/xcgui/xc"
	"path/filepath"
	"strings"
	"syscall"
	"unsafe"
)

// X打开文件夹 打开文件夹. 返回选择的文件夹完整路径.
//
// hParent: 炫彩窗口句柄, 可为0.
func X打开文件夹(父窗口句柄 int) string {
	buf := make([]uint16, 260)
	var hwnd uintptr
	if 父窗口句柄 > 0 {
		hwnd = xc.X窗口_取HWND句柄(父窗口句柄)
	}
	bi := wapi.X结构_对话框选项{
		HwndOwner:      hwnd,
		PidlRoot:       0,
		PszDisplayName: common.Uint16SliceDataPtr(&buf),
		LpszTitle:      common.X文本到uintptr("请选择目录"),
		UlFlags:        wapi.X常量_对话框选项_USENEWUI,
		Lpfn:           0,
		LParam:         0,
		IImage:         0,
	}
	var pszPath string
	wapi.X取文件夹指针实际路径(wapi.X打开文件夹对话框(&bi), &pszPath)
	return pszPath
}

// X打开单文件 打开单个文件. 返回文件完整路径.
//
// hParent: 炫彩窗口句柄, 可为0.
//
// filters: 过滤器数组, 两个成员为一个过滤器, 前面是过滤器描述, 后面是过滤器类型. 填nil则不显示任何过滤器. 例: []string{"Text Files(*txt)", "*.txt", "All Files(*.*)", "*.*"}.
//
// defaultDir: 初始目录, 即默认打开的目录.
func X打开单文件(父窗口句柄 int, 过滤器数组 []string, 初始目录 string) string {
	var hwnd uintptr
	if 父窗口句柄 > 0 {
		hwnd = xc.X窗口_取HWND句柄(父窗口句柄)
	}
	// 拼接过滤器
	var LpstrFilter *uint16 = nil
	if len(过滤器数组) > 0 {
		LpstrFilter = common.StringToUint16Ptr(strings.Join(过滤器数组, wapi.X常量_空文本) + wapi.X常量_空文本2)
	}

	lpstrFile := make([]uint16, 260)
	ofn := wapi.X结构_文件对话框信息{
		LStructSize:       76,
		HwndOwner:         hwnd,
		HInstance:         0,
		LpstrFilter:       LpstrFilter,
		LpstrCustomFilter: nil,
		NMaxCustFilter:    0,
		NFilterIndex:      1,
		LpstrFile:         &lpstrFile[0],
		NMaxFile:          260,
		LpstrFileTitle:    nil,
		NMaxFileTitle:     0,
		LpstrInitialDir:   common.X文本到uintptr(初始目录),
		LpstrTitle:        common.X文本到uintptr("打开文件"),
		Flags:             wapi.X常量_初始化对话框_PATHMUTEXIST, // 用户只能键入有效的路径和文件名
		NFileOffset:       0,
		NFileExtension:    0,
		LpstrDefExt:       0,
		LCustData:         0,
		LpfnHook:          0,
		LpTemplateName:    0,
	}
	ofn.LStructSize = uint32(unsafe.Sizeof(ofn))
	if !wapi.X创建打开对话框(&ofn) {
		return ""
	}
	return syscall.UTF16ToString(lpstrFile)
}

// X打开多文件 打开多个文件. 返回文件完整路径数组.
//
// hParent: 炫彩窗口句柄, 可为0.
//
// filters: 过滤器数组, 两个成员为一个过滤器, 前面是过滤器描述, 后面是过滤器类型. 填nil则不显示任何过滤器. 例: []string{"Text Files(*txt)", "*.txt", "All Files(*.*)", "*.*"}.
//
// defaultDir: 初始目录, 即默认打开的目录.
func X打开多文件(父窗口句柄 int, 过滤器数组 []string, 初始目录 string) []string {
	var hwnd uintptr
	if 父窗口句柄 > 0 {
		hwnd = xc.X窗口_取HWND句柄(父窗口句柄)
	}
	// 拼接过滤器
	var LpstrFilter *uint16 = nil
	if len(过滤器数组) > 0 {
		LpstrFilter = common.StringToUint16Ptr(strings.Join(过滤器数组, wapi.X常量_空文本) + wapi.X常量_空文本2)
	}

	lpstrFile := make([]uint16, 512)
	ofn := wapi.X结构_文件对话框信息{
		LStructSize:       76,
		HwndOwner:         hwnd,
		HInstance:         0,
		LpstrFilter:       LpstrFilter,
		LpstrCustomFilter: nil,
		NMaxCustFilter:    0,
		NFilterIndex:      1,
		LpstrFile:         &lpstrFile[0],
		NMaxFile:          512,
		LpstrFileTitle:    nil,
		NMaxFileTitle:     0,
		LpstrInitialDir:   common.X文本到uintptr(初始目录),
		LpstrTitle:        common.X文本到uintptr("打开文件"),
		Flags:             wapi.X常量_初始化对话框_ALLOWMULTISELECT | wapi.X常量_初始化对话框_EXPLORER | wapi.X常量_初始化对话框_PATHMUTEXIST, // 允许文件多选 | 使用新界面 | 用户只能键入有效的路径和文件名
		NFileOffset:       0,
		NFileExtension:    0,
		LpstrDefExt:       0,
		LCustData:         0,
		LpfnHook:          0,
		LpTemplateName:    0,
	}
	ofn.LStructSize = uint32(unsafe.Sizeof(ofn))
	if !wapi.X创建打开对话框(&ofn) {
		return nil
	}

	slice := common.Uint16SliceToStringSlice(lpstrFile)
	if len(slice) < 2 {
		return nil
	}

	dir := slice[0]
	var s []string
	for i := 1; i < len(slice); i++ {
		s = append(s, filepath.Join(dir, slice[i]))
	}
	return s
}

// X保存文件 保存文件.
//
// hParent: 炫彩窗口句柄, 可为0. 返回文件完整路径.
//
// filters: 过滤器数组, 两个成员为一个过滤器, 前面是过滤器描述, 后面是过滤器类型. 填nil则不显示任何过滤器. 例: []string{"Text Files(*txt)", "*.txt", "All Files(*.*)", "*.*"}.
//
// defaultDir: 初始目录, 即默认打开的目录.
//
// defaultFileName: 默认文件名.
func X保存文件(父窗口句柄 int, 过滤器数组 []string, 初始目录, 默认文件名 string) string {
	var hwnd uintptr
	if 父窗口句柄 > 0 {
		hwnd = xc.X窗口_取HWND句柄(父窗口句柄)
	}
	// 拼接过滤器
	var lpstrFilter *uint16 = nil
	if len(过滤器数组) > 0 {
		lpstrFilter = common.StringToUint16Ptr(strings.Join(过滤器数组, wapi.X常量_空文本) + wapi.X常量_空文本2)
	}

	var lpstrFile *uint16 = nil
	if 默认文件名 != "" {
		lpstrFile = common.StringToUint16Ptr(strings.ReplaceAll(默认文件名, " ", ""))
	} else {
		lpstrFile = &make([]uint16, 260)[0]
	}
	ofn := wapi.X结构_文件对话框信息{
		LStructSize:       76,
		HwndOwner:         hwnd,
		HInstance:         0,
		LpstrFilter:       lpstrFilter,
		LpstrCustomFilter: nil,
		NMaxCustFilter:    0,
		NFilterIndex:      1,
		LpstrFile:         lpstrFile,
		NMaxFile:          260,
		LpstrFileTitle:    nil,
		NMaxFileTitle:     0,
		LpstrInitialDir:   common.X文本到uintptr(初始目录),
		LpstrTitle:        common.X文本到uintptr("保存文件"),
		Flags:             wapi.X常量_初始化对话框_OVERWRITEPROMPT | wapi.X常量_初始化对话框_PATHMUTEXIST | wapi.X常量_初始化对话框_PATHMUTEXIST, // 如果所选文件已存在，则使“另存为”对话框生成一个消息框。用户必须确认是否覆盖文件。| 检测文件路径是否合法
		NFileOffset:       0,
		NFileExtension:    0,
		LpstrDefExt:       0, // 如果用户没有输入文件扩展名, 则默认使用这个
		LCustData:         0,
		LpfnHook:          0,
		LpTemplateName:    0,
	}
	ofn.LStructSize = uint32(unsafe.Sizeof(ofn))
	if !wapi.X创建保存对话框(&ofn) {
		return ""
	}
	return common.Uintptr到文本(uintptr(unsafe.Pointer(lpstrFile)))
}

// X颜色选择框 选择颜色. 返回rgb颜色.
//
// hParent: 炫彩窗口句柄, 可为0.
func X颜色选择框(父窗口句柄 int) int {
	var hwnd uintptr
	if 父窗口句柄 > 0 {
		hwnd = xc.X窗口_取HWND句柄(父窗口句柄)
	}
	var lpCustColors [16]uint32
	cc := wapi.X结构_颜色选择框{
		LStructSize:    36,
		HwndOwner:      hwnd,
		HInstance:      0,
		RgbResult:      0,
		LpCustColors:   &lpCustColors[0],
		Flags:          wapi.X常量_初始化颜色对话框_FULLOPEN, // 默认打开自定义颜色
		LCustData:      0,
		LpfnHook:       0,
		LpTemplateName: 0,
	}
	cc.LStructSize = uint32(unsafe.Sizeof(cc))
	if !wapi.X创建颜色对话框(&cc) {
		return 0
	}
	return int(cc.RgbResult)
}
